package cn.stimd.spring.beans.factory;

import cn.stimd.spring.beans.BeansException;
import org.springframework.core.ResolvableType;

import java.util.List;
import java.util.Map;

/**
 * Created by Stimd
 * 项目地址：https://gitee.com/stimd/spring-wheel
 * 公众号：Java编程探微
 */
public interface BeanFactory {
    //工厂Bean名称的前缀标识
    String FACTORY_BEAN_PREFIX = "&";

    /**
     * 根据Bean的名称获取Bean
     */
    Object getBean(String name);


    /**
     * 根据指定的名称和类型获取Bean
     */
    <T> T getBean(String name, Class<T> requiredType);


    /**
     * 获取指定类型的Bean
     */
    <T> T getBean(Class<T> requiredType) throws BeansException;


    /**
     * 获取指定Bean的类型
     */
    Class<?> getType(String name);


    /**
     * 检查指定名称的Bean是否与指定类型相匹配
     */
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws BeansException;
    boolean isTypeMatch(String name, Class<?> typeToMatch) throws BeansException;

    //-------------------------------------------------------------------------
    // ListableBeanFactory接口的方法
    //-------------------------------------------------------------------------

    /**
     * 是否包含指定Bean名称的BeanDefinition
     */
    boolean containsBeanDefinition(String beanName);


    /**
     * 获取指定类型的所有Bean名称
     */
    List<String> getBeanNamesForType(Class<?> type);


    /**
     * 获取指定类型的Bean的集合
     */
    <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
}
